package agent;

import server.CashPoint;
import server.Customer;
import server.exception.CashPointException;

/**
 * Diese Klasse hilft einem Kunden beim Abwickeln der Zahlungen
 * @author reto
 *
 */
public class CashPointAgent {
	public static final String PERFECT_CASH="PERFECT_CASH";	
	
private final Customer customer;
private static CashPoint cashPoint;
private double customerMoney;
/**
 * @param customer Der Kunde für den der Agent arbeiten soll
 */
public CashPointAgent(final Customer customer) {
	super();
	this.customer = customer;
	if(CashPointAgent.cashPoint==null)
	{
		CashPointAgent.cashPoint=new CashPoint();
	}
}
/**
 * Dem Agenten kann Geld für die Bezahlung gegeben werden
 * @param customerMoney Geld für die Bezahlung der Waren.
 */
public void setCustomerMoney(final double customerMoney) {
	this.customerMoney = customerMoney;
}
/**
 * Gibt zurück wieviel Geld dem Agenten zur Verfügung steht 
 * @return Geld für die Bezahlung der Waren.
 */
public double getCustomerMoney() {
	return this.customerMoney;
}
/**
 * 
 * @return Resultat des Zahlungsvorgangs:
 * <ul>
 * <li>PERFECT_CASH</li>
 * <li>TOO_LITTLE_CASH</li>
 * <li>TOO_MUCH_CASH</li>
 * </ul>
 */
public String pay()
{		
	String payResult=CashPointAgent.PERFECT_CASH;
	try {
		CashPointAgent.cashPoint.pay(this.customer,this.getCustomerMoney());
		this.setCustomerMoney(0);
	} catch (final CashPointException e) {			
		payResult=e.getMessage();		
	}
	return payResult;	
}
/**
 * Convenience
 * @return Gibt den Kunden zurück
 */
public Customer getCustomer() {
	return customer;
}
/**
 * Convenience
 * @return Gibt das Total der Einkäufe für den Kunden zurück
 */
public double getShoppingTotal()
{
	return this.customer.getShoppingCart().getTotal();
}
/**
 * Errechnet
 * @return die Differenz zwischen dem was der Agent an Geld hat und dem was der Kunde an
 * Warenwert im Korb hat.
 */
public double getCashDifference()
{
	return Math.abs(this.getCustomerMoney()-this.customer.getShoppingCart().getTotal());
}


}
